package com.huitong.admin.system.service.impl;

import com.huitong.admin.system.domain.dto.ClassDTO;
import com.huitong.admin.system.domain.dto.ClassPageDTO;
import com.huitong.admin.system.domain.po.ClassPO;
import com.huitong.admin.system.domain.vo.ClassVO;
import com.huitong.admin.system.mapper.ClassMapper;
import com.huitong.admin.system.service.ClassService;
import com.huitong.common.core.domain.Result;
import com.huitong.common.mybatis.constant.TableConstant;
import com.huitong.common.mybatis.domain.PageResult;
import com.huitong.common.mybatis.utils.PageUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static com.huitong.common.redis.constant.CacheConstant.CLASS_KEY_NAME;

/**
 * 班级信息服务层
 *
 * @author fromdrowning
 * @date 2024/5/2 下午9:33
 */
@RequiredArgsConstructor
@Service
public class ClassServiceImpl implements ClassService {

    /**
     * 班级信息数据访问层
     */
    private final ClassMapper classMapper;

    /**
     * 新增班级信息
     *
     * @param classDTO 班级信息
     */
    @CacheEvict(cacheNames = CLASS_KEY_NAME)
    @Override
    public void insertClass(ClassDTO classDTO) {
        ClassPO classPO = new ClassPO();
        BeanUtils.copyProperties(classDTO, classPO);
        classMapper.insertClass(classPO);
    }

    /**
     * 查询班级信息
     *
     * @param id 班级号
     * @return 班级信息
     */
    @Override
    public Result<ClassVO> selectClass(Integer id) {
        return Result.success(classMapper.selectClass(id));
    }

    /**
     * 查询班级信息
     *
     * @param majorId 专业号
     * @return 班级信息
     */
    @Cacheable(cacheNames = CLASS_KEY_NAME)
    @Override
    public Result<List<ClassVO>> selectClassList(Integer majorId) {
        return Result.success(classMapper.selectClassList(majorId));
    }

    /**
     * 查询班级信息
     *
     * @param classPageDTO 分页信息
     * @return 分页信息
     */
    @Override
    public PageResult<ClassVO> pageClass(ClassPageDTO classPageDTO) {
        PageUtils.startPage(classPageDTO, TableConstant.CLASS_TABLE);
        return PageResult.success(classMapper.pageClass(classPageDTO));
    }

    /**
     * 修改班级信息
     *
     * @param classDTO 班级信息
     */
    @CacheEvict(cacheNames = CLASS_KEY_NAME)
    @Override
    public void updateClass(ClassDTO classDTO) {
        ClassPO classPO = new ClassPO();
        BeanUtils.copyProperties(classDTO, classPO);
        classMapper.updateClass(classPO);
    }

    /**
     * 删除班级信息
     *
     * @param id 班级号
     */
    @CacheEvict(cacheNames = CLASS_KEY_NAME)
    @Transactional
    @Override
    public void deleteClass(Integer id) {
        classMapper.insertClassDeleted(id);
        classMapper.deleteClass(id);
        // TODO 删除班级信息时 还需要删除与班级相关的信息
    }
}
